package com.zxy.ziems.server.monitor.utils;

import cn.hutool.core.lang.ParameterizedTypeImpl;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import com.zxy.btp.common.util.JsonUtils;
import com.zxy.ziems.server.monitor.pojo.hik.HikPageResult;
import com.zxy.ziems.server.monitor.pojo.hik.HikResult;
import com.zxy.ziems.server.utils.AssertUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Type;
import java.util.*;

/**
 * @author chdzq
 * @create 2023/5/24
 */
@Slf4j
public class HikPostApiUtils {
    /**
     * 请根据技术支持提供的实际的平台IP/端口和API网关中的合作方信息更换static静态块中的三个参数.
     * [1 host]
     * 		host格式为IP：Port，如10.0.0.1:443
     * 		当使用http协议调用接口时，IP是平台（nginx）IP，Port是http协议的端口；
     *     当使用http协议调用接口时，IP是artemis服务的IP，Port是artemis服务的端口（默认9016）。
     * [2 appKey和appSecret]
     * 		请按照技术支持提供的合作方Key和合作方Secret修改
     * 	    appKey：合作方Key
     * 	    appSecret：合作方Secret
     * 调用前看清接口传入的是什么，是传入json就用doPostStringArtemis方法，是表单提交就用doPostFromArtemis方法
     *
     */
    /**
     * API网关的后端服务上下文为：/artemis
     */
    private static final String ARTEMIS_PATH = "/artemis";

    /**
     * 调用POST请求类型接口
     * @return
     */
    @SneakyThrows
    public static <T> T getPostApiBy(String url, Object params, Class<T> clazz) {
        /**
         * http://ip:port/artemis/api/resource/v1/org/orgList
         * 通过查阅AI Cloud开放平台文档或网关门户的文档可以看到获取组织列表的接口定义,该接口为POST请求的Rest接口, 入参为JSON字符串，接口协议为http。
         * ArtemisHttpUtil工具类提供了doPostStringArtemis调用POST请求的方法，入参可传JSON字符串, 请阅读开发指南了解方法入参，没有的参数可传null
         */
        ArtemisConfig config = new ArtemisConfig();
        config.setHost("172.16.70.158:8001"); // 代理API网关nginx服务器ip端口
        config.setAppKey("20548597");  // 秘钥appkey
        config.setAppSecret("Trn2to09MG7ZGuFgUGGS");// 秘钥appSecret
        final String getCamsApi = ARTEMIS_PATH + url;

        String body = JsonUtils.toJSONString(params);
        Map<String, String> path = new HashMap<>(1);
        path.put("http://", getCamsApi);
        String response = ArtemisHttpUtil.doPostStringArtemis(config,path, body, null, null, "application/json");
        log.info("[请求]：url-{},结果：{}", url, response);
        if (StrUtil.isBlank(response)) {
            return null;
        }
        Type typeReference = buildType(HikResult.class, clazz);
        HikResult<T> result = JSONUtil.toBean(response, typeReference, false);
        AssertUtil.isTrue(HikResult.isSuccess(result), null == result ? "" : result.getMsg());
        return result.getData();
    }

    private static Type buildType(Type... types) {
        ParameterizedTypeImpl beforeType = null;
        if (types != null && types.length > 0) {
            for (int i = types.length - 1; i > 0; i--) {
                beforeType = new ParameterizedTypeImpl(new Type[]{beforeType == null ? types[i] : beforeType}, null, types[i - 1]);
            }
        }
        return beforeType;
    }

    @SneakyThrows
    public static <T> List<T> getPageListPostApiBy(String url, Object params, Class<T> clazz) {
        /**
         * http://ip:port/artemis/api/resource/v1/org/orgList
         * 通过查阅AI Cloud开放平台文档或网关门户的文档可以看到获取组织列表的接口定义,该接口为POST请求的Rest接口, 入参为JSON字符串，接口协议为http。
         * ArtemisHttpUtil工具类提供了doPostStringArtemis调用POST请求的方法，入参可传JSON字符串, 请阅读开发指南了解方法入参，没有的参数可传null
         */
        ArtemisConfig config = new ArtemisConfig();
        config.setHost("172.16.70.158:8001"); // 代理API网关nginx服务器ip端口
        config.setAppKey("20548597");  // 秘钥appkey
        config.setAppSecret("Trn2to09MG7ZGuFgUGGS");// 秘钥appSecret
        final String getCamsApi = ARTEMIS_PATH + url;

        String body = JsonUtils.toJSONString(params);
        Map<String, String> path = new HashMap<>(1);
        path.put("http://", getCamsApi);
        String response = ArtemisHttpUtil.doPostStringArtemis(config,path, body, null, null, "application/json");
        log.info("[请求]：url-{},结果：{}", url, response);
        if (StrUtil.isBlank(response)) {
            return null;
        }


        Type typeReference = buildType(HikResult.class, HikPageResult.class, clazz);
        HikResult<HikPageResult<T>> result = JSONUtil.toBean(response, typeReference, false);
        AssertUtil.isTrue(HikResult.isSuccess(result), null == result ? "" : result.getMsg());
        if (null == result.getData()) {
            return new ArrayList<>();
        }
         return result.getData().getList();
    }

}
